#ifndef ESTRATEGIARECURSOESCRITURADIFERIDA_H_
#define ESTRATEGIARECURSOESCRITURADIFERIDA_H_

#include "EstrategiaRecurso.h"
#include "../Constantes.h"
#include <list>

class BufferDiferido;
class NodoBuffer;
class Almacenamiento;

/*
 * Estrategia de Recurso de escritura diferida.
 */
class EstrategiaRecursoEscrituraDiferida: public EstrategiaRecurso {

private:
	cantBytes tamanioBloque;
	unsigned cantMaxBuffers;
	list<NodoBuffer*> buffers;
	list<NodoBuffer*> buffersLibres;

public:
	/*
	 * Pre:-
	 * Pos: Crea una nueva instancia.
	 */
	EstrategiaRecursoEscrituraDiferida(Archivo* archivo, cantBytes tamanioBloque);

	/*
	 * Pre: -
	 * Pos: Libera los recursos instanciados.
	 */
	virtual ~EstrategiaRecursoEscrituraDiferida();

	/*
	 * Pre: offset valido y bytes del tamanio configurado.
	 * Pos: escribe en el almacenamiento los bytes pasados por argumento.
	 */
	virtual void escribir(const Bytes& bytes, offset offset);

	/*
	 * Pre: offset y cantidad de bytes calidos
	 * Pos: devuelve los bytes leidos.
	 */
	virtual Bytes leer(offset offset, cantBytes cantBytes);

	/*
	 * Pre: -
	 * Pos: devuelve el tamanio del archivo.
	 */
	offset getTamanioArchivo();

	/*
	 * Pre: -
	 * Pos: devuelve el path del archivo.
	 */
	string getPath();

	/*
	 * Pre: -
	 * Pos: modifica el tamanio del archivo.
	 */
	bool setTamanioArchivo(cantBytes nuevo);

	/*
	 * Pre: -
	 * Pos: imprime el contenido del buffer.
	 */
	virtual void imprimirBuffer();

private:
	NodoBuffer* buscarBuffer(int numBloque);
	NodoBuffer* obtenerOCrearBuffer(int numBloque,const Bytes& dato);
};

#endif /* ESTRATEGIARECURSOESCRITURADIFERIDA_H_ */
